package com.bzkj.basicinfo.service;

import com.bzkj.basicinfo.domain.CustomerMapping;
import com.bzkj.basicinfo.domain.vo.CustomerComparisonVo;
import com.bzkj.basicinfo.domain.yxl.Customer;
import com.bzkj.common.core.domain.AjaxResult;

import java.util.List;
import java.util.Map;

/**
 * 往来单位对比服务接口
 *
 * @author system
 * @date 2025-01-29
 */
public interface CustomerComparisonService {

    /**
     * 查询码上放心往来单位列表（包含映射状态）
     *
     * @param customerName 客户名称（可选）
     * @param mappingStatus 映射状态（可选）：null-全部，true-已映射，false-未映射
     * @return 码上放心往来单位列表
     */
    CustomerComparisonVo.MsfxCustomerVo[] selectMsfxCustomerList(String customerName, Boolean mappingStatus);

    /**
     * 分页查询码上放心往来单位列表（包含映射状态）
     *
     * @param customerName 客户名称（可选）
     * @param mappingStatus 映射状态（可选）：null-全部，true-已映射，false-未映射
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 分页结果
     */
    com.github.pagehelper.PageInfo<CustomerComparisonVo.MsfxCustomerVo> selectMsfxCustomerListWithPage(String customerName, Boolean mappingStatus, int pageNum, int pageSize);

    /**
     * 查询ERP往来单位列表（包含映射状态）
     *
     * @param dwmch 单位名称（可选）
     * @param mappingStatus 映射状态（可选）：null-全部，true-已映射，false-未映射
     * @return ERP往来单位列表
     */
    CustomerComparisonVo.ErpCustomerVo[] selectErpCustomerList(String dwmch, Boolean mappingStatus);

    /**
     * 分页查询ERP往来单位列表（包含映射状态）
     *
     * @param dwmch 单位名称（可选）
     * @param mappingStatus 映射状态（可选）：null-全部，true-已映射，false-未映射
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 分页结果
     */
    com.github.pagehelper.PageInfo<CustomerComparisonVo.ErpCustomerVo> selectErpCustomerListWithPage(String dwmch, Boolean mappingStatus, int pageNum, int pageSize);

    /**
     * 查询往来单位对比数据
     *
     * @param msfxCustomerName 码上放心客户名称（可选）
     * @param erpCustomerName ERP客户名称（可选）
     * @param mappingStatus 映射状态（可选）
     * @return 往来单位对比数据
     */
    CustomerComparisonVo selectCustomerComparison(String msfxCustomerName, String erpCustomerName, Boolean mappingStatus);

    /**
     * 查询未映射的码上放心往来单位
     *
     * @param customerName 客户名称（可选）
     * @return 未映射的往来单位列表
     */
    CustomerComparisonVo.MsfxCustomerVo[] selectUnmappedMsfxCustomers(String customerName);

    /**
     * 查询未映射的ERP往来单位
     *
     * @param dwmch 单位名称（可选）
     * @return 未映射的往来单位列表
     */
    CustomerComparisonVo.ErpCustomerVo[] selectUnmappedErpCustomers(String dwmch);

    /**
     * 查询启用状态的ERP往来单位列表（包含映射状态）
     *
     * @param dwmch 单位名称（可选）
     * @param mappingStatus 映射状态（可选）：null-全部，true-已映射，false-未映射
     * @return 启用状态的ERP往来单位列表
     */
    CustomerComparisonVo.ErpCustomerVo[] selectEnabledErpCustomerList(String dwmch, Boolean mappingStatus);

    /**
     * 从从库查询ERP客户数据
     *
     * @param dwmch 单位名称（可选）
     * @return ERP客户列表
     */
    List<Customer> getErpCustomersFromSlave(String dwmch);

    /**
     * 从从库查询启用状态的ERP客户数据
     *
     * @param dwmch 单位名称（可选）
     * @return 启用状态的ERP客户列表
     */
    List<Customer> getEnabledErpCustomersFromSlave(String dwmch);

    /**
     * 从主库获取ERP客户映射关系Map
     *
     * @return 映射关系Map
     */
    Map<String, CustomerMapping> getErpMappingMapFromMaster();

    /**
     * 预览基于名称完全匹配的自动映射结果
     *
     * @return 预览结果
     */
    AjaxResult previewAutoMatch();

    /**
     * 基于名称完全匹配自动创建映射关系
     *
     * @return 匹配结果
     */
    AjaxResult autoMatchByName();
}
